/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package entityprojet;

import entityprojet.exceptions.NonexistentEntityException;
import entityprojet.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

/**
 *
 * @author Ron
 */
public class FDocligneJpaController implements Serializable {

    public FDocligneJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public FDocligneJpaController() {
        this.emf = Persistence.createEntityManagerFactory("projetT_RPU");
    }
    
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(FDocligne FDocligne) throws PreexistingEntityException, Exception {
        if (FDocligne.getFDocligneCollection() == null) {
            FDocligne.setFDocligneCollection(new ArrayList<FDocligne>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FArticle ARRef = FDocligne.getARRef();
            if (ARRef != null) {
                ARRef = em.getReference(ARRef.getClass(), ARRef.getCbMarq());
                FDocligne.setARRef(ARRef);
            }
            FCollaborateur cbCONo = FDocligne.getCbCONo();
            if (cbCONo != null) {
                cbCONo = em.getReference(cbCONo.getClass(), cbCONo.getCbMarq());
                FDocligne.setCbCONo(cbCONo);
            }
            FDepot cbDENo = FDocligne.getCbDENo();
            if (cbDENo != null) {
                cbDENo = em.getReference(cbDENo.getClass(), cbDENo.getCbMarq());
                FDocligne.setCbDENo(cbDENo);
            }
            FDocligne cbDLNoLink = FDocligne.getCbDLNoLink();
            if (cbDLNoLink != null) {
                cbDLNoLink = em.getReference(cbDLNoLink.getClass(), cbDLNoLink.getCbMarq());
                FDocligne.setCbDLNoLink(cbDLNoLink);
            }
            FRessourceprod RPCode = FDocligne.getRPCode();
            if (RPCode != null) {
                RPCode = em.getReference(RPCode.getClass(), RPCode.getCbMarq());
                FDocligne.setRPCode(RPCode);
            }
            Collection<FDocligne> attachedFDocligneCollection = new ArrayList<FDocligne>();
            for (FDocligne FDocligneCollectionFDocligneToAttach : FDocligne.getFDocligneCollection()) {
                FDocligneCollectionFDocligneToAttach = em.getReference(FDocligneCollectionFDocligneToAttach.getClass(), FDocligneCollectionFDocligneToAttach.getCbMarq());
                attachedFDocligneCollection.add(FDocligneCollectionFDocligneToAttach);
            }
            FDocligne.setFDocligneCollection(attachedFDocligneCollection);
            em.persist(FDocligne);
            if (ARRef != null) {
                ARRef.getFDocligneCollection().add(FDocligne);
                ARRef = em.merge(ARRef);
            }
            if (cbCONo != null) {
                cbCONo.getFDocligneCollection().add(FDocligne);
                cbCONo = em.merge(cbCONo);
            }
            if (cbDENo != null) {
                cbDENo.getFDocligneCollection().add(FDocligne);
                cbDENo = em.merge(cbDENo);
            }
            if (cbDLNoLink != null) {
                cbDLNoLink.getFDocligneCollection().add(FDocligne);
                cbDLNoLink = em.merge(cbDLNoLink);
            }
            if (RPCode != null) {
                RPCode.getFDocligneCollection().add(FDocligne);
                RPCode = em.merge(RPCode);
            }
            for (FDocligne FDocligneCollectionFDocligne : FDocligne.getFDocligneCollection()) {
                FDocligne oldCbDLNoLinkOfFDocligneCollectionFDocligne = FDocligneCollectionFDocligne.getCbDLNoLink();
                FDocligneCollectionFDocligne.setCbDLNoLink(FDocligne);
                FDocligneCollectionFDocligne = em.merge(FDocligneCollectionFDocligne);
                if (oldCbDLNoLinkOfFDocligneCollectionFDocligne != null) {
                    oldCbDLNoLinkOfFDocligneCollectionFDocligne.getFDocligneCollection().remove(FDocligneCollectionFDocligne);
                    oldCbDLNoLinkOfFDocligneCollectionFDocligne = em.merge(oldCbDLNoLinkOfFDocligneCollectionFDocligne);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findFDocligne(FDocligne.getCbMarq()) != null) {
                throw new PreexistingEntityException("FDocligne " + FDocligne + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(FDocligne FDocligne) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FDocligne persistentFDocligne = em.find(FDocligne.class, FDocligne.getCbMarq());
            FArticle ARRefOld = persistentFDocligne.getARRef();
            FArticle ARRefNew = FDocligne.getARRef();
            FCollaborateur cbCONoOld = persistentFDocligne.getCbCONo();
            FCollaborateur cbCONoNew = FDocligne.getCbCONo();
            FDepot cbDENoOld = persistentFDocligne.getCbDENo();
            FDepot cbDENoNew = FDocligne.getCbDENo();
            FDocligne cbDLNoLinkOld = persistentFDocligne.getCbDLNoLink();
            FDocligne cbDLNoLinkNew = FDocligne.getCbDLNoLink();
            FRessourceprod RPCodeOld = persistentFDocligne.getRPCode();
            FRessourceprod RPCodeNew = FDocligne.getRPCode();
            Collection<FDocligne> FDocligneCollectionOld = persistentFDocligne.getFDocligneCollection();
            Collection<FDocligne> FDocligneCollectionNew = FDocligne.getFDocligneCollection();
            if (ARRefNew != null) {
                ARRefNew = em.getReference(ARRefNew.getClass(), ARRefNew.getCbMarq());
                FDocligne.setARRef(ARRefNew);
            }
            if (cbCONoNew != null) {
                cbCONoNew = em.getReference(cbCONoNew.getClass(), cbCONoNew.getCbMarq());
                FDocligne.setCbCONo(cbCONoNew);
            }
            if (cbDENoNew != null) {
                cbDENoNew = em.getReference(cbDENoNew.getClass(), cbDENoNew.getCbMarq());
                FDocligne.setCbDENo(cbDENoNew);
            }
            if (cbDLNoLinkNew != null) {
                cbDLNoLinkNew = em.getReference(cbDLNoLinkNew.getClass(), cbDLNoLinkNew.getCbMarq());
                FDocligne.setCbDLNoLink(cbDLNoLinkNew);
            }
            if (RPCodeNew != null) {
                RPCodeNew = em.getReference(RPCodeNew.getClass(), RPCodeNew.getCbMarq());
                FDocligne.setRPCode(RPCodeNew);
            }
            Collection<FDocligne> attachedFDocligneCollectionNew = new ArrayList<FDocligne>();
            for (FDocligne FDocligneCollectionNewFDocligneToAttach : FDocligneCollectionNew) {
                FDocligneCollectionNewFDocligneToAttach = em.getReference(FDocligneCollectionNewFDocligneToAttach.getClass(), FDocligneCollectionNewFDocligneToAttach.getCbMarq());
                attachedFDocligneCollectionNew.add(FDocligneCollectionNewFDocligneToAttach);
            }
            FDocligneCollectionNew = attachedFDocligneCollectionNew;
            FDocligne.setFDocligneCollection(FDocligneCollectionNew);
            FDocligne = em.merge(FDocligne);
            if (ARRefOld != null && !ARRefOld.equals(ARRefNew)) {
                ARRefOld.getFDocligneCollection().remove(FDocligne);
                ARRefOld = em.merge(ARRefOld);
            }
            if (ARRefNew != null && !ARRefNew.equals(ARRefOld)) {
                ARRefNew.getFDocligneCollection().add(FDocligne);
                ARRefNew = em.merge(ARRefNew);
            }
            if (cbCONoOld != null && !cbCONoOld.equals(cbCONoNew)) {
                cbCONoOld.getFDocligneCollection().remove(FDocligne);
                cbCONoOld = em.merge(cbCONoOld);
            }
            if (cbCONoNew != null && !cbCONoNew.equals(cbCONoOld)) {
                cbCONoNew.getFDocligneCollection().add(FDocligne);
                cbCONoNew = em.merge(cbCONoNew);
            }
            if (cbDENoOld != null && !cbDENoOld.equals(cbDENoNew)) {
                cbDENoOld.getFDocligneCollection().remove(FDocligne);
                cbDENoOld = em.merge(cbDENoOld);
            }
            if (cbDENoNew != null && !cbDENoNew.equals(cbDENoOld)) {
                cbDENoNew.getFDocligneCollection().add(FDocligne);
                cbDENoNew = em.merge(cbDENoNew);
            }
            if (cbDLNoLinkOld != null && !cbDLNoLinkOld.equals(cbDLNoLinkNew)) {
                cbDLNoLinkOld.getFDocligneCollection().remove(FDocligne);
                cbDLNoLinkOld = em.merge(cbDLNoLinkOld);
            }
            if (cbDLNoLinkNew != null && !cbDLNoLinkNew.equals(cbDLNoLinkOld)) {
                cbDLNoLinkNew.getFDocligneCollection().add(FDocligne);
                cbDLNoLinkNew = em.merge(cbDLNoLinkNew);
            }
            if (RPCodeOld != null && !RPCodeOld.equals(RPCodeNew)) {
                RPCodeOld.getFDocligneCollection().remove(FDocligne);
                RPCodeOld = em.merge(RPCodeOld);
            }
            if (RPCodeNew != null && !RPCodeNew.equals(RPCodeOld)) {
                RPCodeNew.getFDocligneCollection().add(FDocligne);
                RPCodeNew = em.merge(RPCodeNew);
            }
            for (FDocligne FDocligneCollectionOldFDocligne : FDocligneCollectionOld) {
                if (!FDocligneCollectionNew.contains(FDocligneCollectionOldFDocligne)) {
                    FDocligneCollectionOldFDocligne.setCbDLNoLink(null);
                    FDocligneCollectionOldFDocligne = em.merge(FDocligneCollectionOldFDocligne);
                }
            }
            for (FDocligne FDocligneCollectionNewFDocligne : FDocligneCollectionNew) {
                if (!FDocligneCollectionOld.contains(FDocligneCollectionNewFDocligne)) {
                    FDocligne oldCbDLNoLinkOfFDocligneCollectionNewFDocligne = FDocligneCollectionNewFDocligne.getCbDLNoLink();
                    FDocligneCollectionNewFDocligne.setCbDLNoLink(FDocligne);
                    FDocligneCollectionNewFDocligne = em.merge(FDocligneCollectionNewFDocligne);
                    if (oldCbDLNoLinkOfFDocligneCollectionNewFDocligne != null && !oldCbDLNoLinkOfFDocligneCollectionNewFDocligne.equals(FDocligne)) {
                        oldCbDLNoLinkOfFDocligneCollectionNewFDocligne.getFDocligneCollection().remove(FDocligneCollectionNewFDocligne);
                        oldCbDLNoLinkOfFDocligneCollectionNewFDocligne = em.merge(oldCbDLNoLinkOfFDocligneCollectionNewFDocligne);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = FDocligne.getCbMarq();
                if (findFDocligne(id) == null) {
                    throw new NonexistentEntityException("The fDocligne with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            FDocligne FDocligne;
            try {
                FDocligne = em.getReference(FDocligne.class, id);
                FDocligne.getCbMarq();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The FDocligne with id " + id + " no longer exists.", enfe);
            }
            FArticle ARRef = FDocligne.getARRef();
            if (ARRef != null) {
                ARRef.getFDocligneCollection().remove(FDocligne);
                ARRef = em.merge(ARRef);
            }
            FCollaborateur cbCONo = FDocligne.getCbCONo();
            if (cbCONo != null) {
                cbCONo.getFDocligneCollection().remove(FDocligne);
                cbCONo = em.merge(cbCONo);
            }
            FDepot cbDENo = FDocligne.getCbDENo();
            if (cbDENo != null) {
                cbDENo.getFDocligneCollection().remove(FDocligne);
                cbDENo = em.merge(cbDENo);
            }
            FDocligne cbDLNoLink = FDocligne.getCbDLNoLink();
            if (cbDLNoLink != null) {
                cbDLNoLink.getFDocligneCollection().remove(FDocligne);
                cbDLNoLink = em.merge(cbDLNoLink);
            }
            FRessourceprod RPCode = FDocligne.getRPCode();
            if (RPCode != null) {
                RPCode.getFDocligneCollection().remove(FDocligne);
                RPCode = em.merge(RPCode);
            }
            Collection<FDocligne> FDocligneCollection = FDocligne.getFDocligneCollection();
            for (FDocligne FDocligneCollectionFDocligne : FDocligneCollection) {
                FDocligneCollectionFDocligne.setCbDLNoLink(null);
                FDocligneCollectionFDocligne = em.merge(FDocligneCollectionFDocligne);
            }
            em.remove(FDocligne);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<FDocligne> findFDocligneEntities() {
        return findFDocligneEntities(true, -1, -1);
    }

    public List<FDocligne> findFDocligneEntities(int maxResults, int firstResult) {
        return findFDocligneEntities(false, maxResults, firstResult);
    }

    private List<FDocligne> findFDocligneEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(FDocligne.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public FDocligne findFDocligne(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(FDocligne.class, id);
        } finally {
            em.close();
        }
    }

    public int getFDocligneCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<FDocligne> rt = cq.from(FDocligne.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
